package matematicadiscretaxml;

import java.util.ArrayList;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author diego
 */
public class AnalizadorSintactico {

    private ArrayList lista_lexemas = new ArrayList();
    private ArrayList lista_errores_sint = new ArrayList();
    ObjetoQuery tabla_obj_query[][] = new ObjetoQuery[0][0];

    public AnalizadorSintactico(){}

    public AnalizadorSintactico(ArrayList _lista_lexemas)
    {
        lista_lexemas = _lista_lexemas;
    }

/*
 * TIPOS DE LEXEMAS:
 * -----------------------
 * PALABRAS RESERVADAS   1
 * SIMBOLOS              2
 * OPERADORES            3
 * IDENTIFICADORES       4 (TABLAS Y CAMPOS)
 * CONSTANTE CADENA      5
 * CONSTANTE NUMERO      6
 */
    
    public void generarArbolSintactico()
    {
        int tipo_sentencia_sql = determinarTipoSentencia();
        
        switch(tipo_sentencia_sql)
        {
            case -1:
                getLista_errores_sint().add(new Error("TIPO SENTENCIA SQL", "NO SE PUDO IDENTIFICAR EL TIPO DE SENTENCIA SQL"));
                break;
            case 0:
                break;
            case 1:
                Seleccion obj_seleccion = new Seleccion(lista_lexemas);
                obj_seleccion.generarArbolSintacticoSeleccion();
                lista_errores_sint = obj_seleccion.lista_errores_seleccion;
                if(lista_errores_sint.isEmpty())
                {
                    tabla_obj_query = obj_seleccion.tabla_obj_query;
                }
                else
                {
                    tabla_obj_query = new ObjetoQuery[0][0];
                }
                
                break;
            case 2:
                Insercion obj_insercion = new Insercion(lista_lexemas);
                obj_insercion.generarArbolSintacticoInsercion();
                lista_errores_sint = obj_insercion.lista_errores_insercion;
                break;
            case 3:
                Actualizacion obj_actualizacion = new Actualizacion(lista_lexemas);
                obj_actualizacion.generarArbolSintacticoActualizacion();
                lista_errores_sint = obj_actualizacion.lista_errores_actualizacion;
                break;
            case 4:
                Eliminacion obj_eliminacion = new Eliminacion(lista_lexemas);
                obj_eliminacion.generarArbolSintacticoEliminacion();
                lista_errores_sint = obj_eliminacion.lista_errores_eliminacion;
                break;
            case 5:
                CreacionTablas obj_creacion = new CreacionTablas(lista_lexemas);
                obj_creacion.generarArbolSintacticoCreacionTablas();
                lista_errores_sint = obj_creacion.lista_errores_creacion_tablas;
                break;
        }

    }

/*
 * TIPOS DE SENTENCIA SQL:
 * ----------------------
 * NINGUNA = 0 ( CON EL CUAL DEBE BOTAR ERROR )
 * SELECCION = 1
 * INSERCION = 2
 * ACTUALIZACION = 3
 * BORRADO = 4
 * CREATE = 5
 */
    public int determinarTipoSentencia()
    {
        int tipo_sentencia_sql = 0;
        String lexema = "";

        for(int i = 0; i < lista_lexemas.size(); i++)
        {
            lexema = ((Lexema)lista_lexemas.get(i)).getLexema();

            if( lexema.toLowerCase().equals("select")  )
            {
                if(tipo_sentencia_sql == 0)
                {
                    tipo_sentencia_sql = 1;
                }
                else
                {
                    tipo_sentencia_sql = -1;
                }
            }
            else if(lexema.toLowerCase().equals("insert"))
            {
                if(tipo_sentencia_sql == 0)
                {
                    tipo_sentencia_sql = 2;
                }
                else
                {
                    tipo_sentencia_sql = -1;
                }
            }
            else if(lexema.toLowerCase().equals("update"))
            {
                if(tipo_sentencia_sql == 0)
                {
                    tipo_sentencia_sql = 3;
                }
                else
                {
                    tipo_sentencia_sql = -1;
                }
            }
            else if(lexema.toLowerCase().equals("delete"))
            {
                if(tipo_sentencia_sql == 0)
                {
                    tipo_sentencia_sql = 4;
                }
                else
                {
                    tipo_sentencia_sql = -1;
                }
            }
            else if(lexema.toLowerCase().equals("create"))
            {
                if(tipo_sentencia_sql == 0)
                {
                    tipo_sentencia_sql = 5;
                }
                else
                {
                    tipo_sentencia_sql = -1;
                }
            }

        }
        
        return tipo_sentencia_sql;
    }

    /**
     * @return the lista_errores_sint
     */
    public ArrayList getLista_errores_sint() {
        return lista_errores_sint;
    }

    /**
     * @param lista_errores_sint the lista_errores_sint to set
     */
    public void setLista_errores_sint(ArrayList lista_errores_sint) {
        this.lista_errores_sint = lista_errores_sint;
    }

//    public boolean generarArbolSintactico()
//    {
//        boolean bandera_error = false;
//        int bloque = 0;
//        int tipo_sentencia_sql = 0;
//
//        Lexema lexema_anterior;
//        Lexema lexema_posterior;
//
//        for(int i = 0; i<lista_lexemas.size(); i++)
//        {
//            if( !bandera_error )
//            {
//                switch(((Lexema)lista_lexemas.get(i)).getTipo_lexema())
//                {
//                    case 1:
//                            if( ((Lexema)lista_lexemas.get(i)).getLexema().equals("SELECT")
//                                || ((Lexema)lista_lexemas.get(i)).getLexema().equals("select") )
//                            {
//                                bloque = 1;
//                                tipo_sentencia_sql = 1;
//                                if( i > 0 )
//                                {
//                                    lexema_anterior = ((Lexema)lista_lexemas.get(i-1));
//                                }
//                                else
//                                {
//                                    lexema_anterior = null;
//                                }
//
//                                if( i+1 < lista_lexemas.size())
//                                {
//                                    lexema_posterior = ((Lexema)lista_lexemas.get(i+1));
//                                }
//                                else
//                                {
//                                    lexema_posterior = null;
//                                }
//
//                                Select cselect = new Select(tipo_sentencia_sql, bloque, lexema_anterior, lexema_posterior, lista_lexemas);
//
//                                if( ! cselect.evaluarSelect() )
//                                {
////                                    cselect.evaluarElementosSelect();
//                                    //INGRESAR EN ARBOL SINTACTICO
//                                }
//                                else
//                                {
//                                    bandera_error = true;
//                                    lista_errores_sint = cselect.getLista_errores();
//                                }
//                            }
//
//                            else if(((Lexema)lista_lexemas.get(i)).getLexema().equals("FROM")
//                                || ((Lexema)lista_lexemas.get(i)).getLexema().equals("from") )
//                            {
//                                bloque = 2;
//                            }
//                            else if(((Lexema)lista_lexemas.get(i)).getLexema().equals("WHERE")
//                                || ((Lexema)lista_lexemas.get(i)).getLexema().equals("where") )
//                            {
//                                bloque = 3;
//                            }
//                            if( ((Lexema)lista_lexemas.get(i)).getLexema().equals("AND")
//                                || ((Lexema)lista_lexemas.get(i)).getLexema().equals("and") )
//                            {
//
//                            }
//                            else if(((Lexema)lista_lexemas.get(i)).getLexema().equals("OR")
//                                || ((Lexema)lista_lexemas.get(i)).getLexema().equals("OR") )
//                            {
//
//                            }
//                        break;
//
//                    case 2:
//                            if( ((Lexema)lista_lexemas.get(i)).getLexema().equals(",") )
//                            {
//
//                            }
//                            else if( ((Lexema)lista_lexemas.get(i)).getLexema().equals(";")  )
//                            {
//
//                            }
//                        break;
//
//                    case 3:
//                            if( ((Lexema)lista_lexemas.get(i)).getLexema().equals("=") )
//                            {
//
//                            }
//
//                        break;
//                    case 4:
//
//                        break;
//                    case 5:
//
//                        break;
//                    case 6:
//
//                        break;
//                }
//            }
//
//        }
//        return bandera_error;
//    }


//    public void notacionPostFija()
//    {
//        ArrayList pila = new ArrayList();
//        ArrayList lista_salida = new ArrayList();
//        ArrayList lista_entrada = new ArrayList();
//        int i = 0;
//
//        lista_entrada = lista_lexemas;
//
//        while ( !lista_entrada.isEmpty() && lista_errores_sint.isEmpty() )
//        {
//            switch( ((Lexema)lista_entrada.get(i)).getTipo_lexema() )
//            {
//                case 1:
//                    System.out.println("-------------------------bloque_1");
//                    while( !pila.isEmpty() && ( ((Lexema)pila.get(pila.size()-1)).getTipo_lexema() == 1
//                                                 || ((Lexema)pila.get(pila.size()-1)).getTipo_lexema() == 2
//                                                 || ((Lexema)pila.get(pila.size()-1)).getTipo_lexema() == 3 ) )
//                    {
//
//                        int indice = pila.size()-1;
//                        lista_salida.add(pila.get(indice));
//
//                        pila.remove(indice);
//
//                    }
//                    pila.add(lista_entrada.get(i));
//                    break;
//
//                case 2:
//                    System.out.println("-------------------------bloque_2");
//                    while( !pila.isEmpty() && ( ((Lexema)pila.get(pila.size()-1)).getTipo_lexema() == 1
//                                                 || ((Lexema)pila.get(pila.size()-1)).getTipo_lexema() == 2
//                                                 || ((Lexema)pila.get(pila.size()-1)).getTipo_lexema() == 3 ) )
//                    {
//                        int indice = pila.size()-1;
//                        lista_salida.add(pila.get(indice));
//
//                        pila.remove(indice);
//
//                    }
//                    pila.add(lista_entrada.get(i));
//
//                    break;
//
//                case 3:
//                    System.out.println("-------------------------bloque_3");
//                    while( !pila.isEmpty() && ( ((Lexema)pila.get(pila.size()-1)).getTipo_lexema() == 1
//                                                 || ((Lexema)pila.get(pila.size()-1)).getTipo_lexema() == 2
//                                                 || ((Lexema)pila.get(pila.size()-1)).getTipo_lexema() == 3 ) )
//                    {
//                        int indice = pila.size()-1;
//                        lista_salida.add(pila.get(indice));
//
//
//                        pila.remove(indice);
//
//                    }
//                    pila.add(lista_entrada.get(i));
//
//                    break;
//
//                case 4: //IDENTIFICADOR
//                    System.out.println("-------------------------bloque_4");
//                    lista_salida.add(lista_entrada.get(i));
//
//                    break;
//
//                case 5: //CONSTANTE CADENA
//                    System.out.println("-------------------------bloque_5");
//                    lista_salida.add(lista_entrada.get(i));
//
//                    break;
//
//                case 6: // CONSTANTE NUMERO
//                    System.out.println("-------------------------bloque_6");
//                    lista_salida.add(lista_entrada.get(i));
//
//                    break;
//            }
//            i++;
//        }
//
//        while( !pila.isEmpty() )
//        {
//            int k = pila.size()-1;
//            lista_salida.add(pila.get(k));
//
//            pila.remove(k);
//            try
//            {
//
//            }
//            catch(Exception e)
//            {
//
//            }
//        }
//    }
//
//
//    public void imprimirLista(ArrayList lista, String nombre_lista)
//    {
//        System.out.println("******************* NOMBRE LISTA : "+nombre_lista+"******************");
//        for(int i = 0; i <lista.size(); i++)
//        {
//            System.out.print(((Lexema)lista.get(i)).getLexema()+" || ");
//        }
//        System.out.println();
//        System.out.println("******************************************************************");
//    }
    
}


